package com.uade.tp.negocio;

import java.util.Vector;

import com.uade.tp.negocio.view.ComidaView;
import com.uade.tp.persistencia.AdministrarPersistenciaComida;

public class Comida {
	
	private String nombre;
	private float rentabilidad;
	private Receta receta;
	private Seccion seccion;
	private boolean estado;
	
	public Comida(String nombre,float rentabilidad,Receta receta,Seccion seccion) {
		this.nombre = nombre;
		this.rentabilidad = rentabilidad;
		this.receta = receta;
		this.seccion=seccion;
		this.setEstado(true);
		AdministrarPersistenciaComida.getInstancia().insert(this);
	}
	public Comida() {
		seccion = new Seccion();
		receta = new Receta();
		this.setEstado(true);
	}
	
	public String getNombre() {
		return nombre;
	}
	
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public float getPrecioVenta() {
		return rentabilidad;
	}
	
	public boolean isEstado() {
		return estado;
	}

	public void setEstado(boolean estado) {
		this.estado = estado;
	}	
	
	public void setRentabilidad(float rentabilidad) {
		this.rentabilidad = rentabilidad;
		
		AdministrarPersistenciaComida.getInstancia().update(this);
	}
	public Receta getReceta() {
		return receta;
	}
	public void setReceta(Receta receta) {
		if(receta == null) {
			receta = new Receta();
		}
		this.receta = receta;
		
		AdministrarPersistenciaComida.getInstancia().update(this);
	}
	public Seccion getSeccion() {
		return seccion;
	}
	public void setSeccion(Seccion seccion) {
		if(seccion == null) {
			seccion = new Seccion();
		}
		this.seccion = seccion;
		
		AdministrarPersistenciaComida.getInstancia().update(this);
	}
	
	public ComidaView getView() {
		
		return new ComidaView(this.nombre,this.rentabilidad,
						this.receta.getView(),this.seccion.getView());
	}

	public static Vector<ComidaView> obtenerComidasView() 
	{
		return AdministrarPersistenciaComida.getInstancia().obtenerComidasView();
	}
	
	public static Comida buscarComida(String nombre)
	{
		return AdministrarPersistenciaComida.getInstancia().buscarComida(nombre);
	}
	
	public void delete()
	{
		this.estado = false;
		
		AdministrarPersistenciaComida.getInstancia().delete(this);
	}
	
	/**
	 * Obtiene todos los productos de la comida 
	 * y primero verifica si alcanza el stock. 
	 * Si alcanza el stock prepara la comida (descuenta stock)
	 * @throws Exception 
	 */
	public void preparar(int cantidad) throws Exception {
		Vector<Ingrediente> i = this.receta.obtenerTodosIngredientes();
		if(sePuedePreparar(i,cantidad)) {
			
			for( int x = 0 ; x < i.size() ; x++) {
				this.seccion.descontarStock(
						i.get(x).getProducto().getNombre(),
						i.get(x).getCantidadInt() * cantidad
						);				
			}

		} else {
			  throw new Exception();
		}
	}
	
	
	public boolean sePuedePreparar(Vector<Ingrediente> ingredientes,int cantidad) throws Exception {
		boolean valor = true;
		
		//chequeo si todas las recetas estan activas
		if(!this.receta.todasActivas())
			throw new Exception(" POSEE RECETAS INACTIVAS ");
		if(this.estado == true) {
			Ingrediente i = null;
			
			for(int x = 0 ; x < ingredientes.size() && valor ; x++) {
				i = ingredientes.get(x);
				//SI PRODUCTO ESTA ACTIVO
				if(i.getProducto().isEstado() == false) {
					throw new Exception("POSEE INGREDIENTE DADO DE BAJA");
				}
				//SI HAY STOCK
				valor = chequearStock(i,cantidad);
				
			}
		}
		return valor;
	}
	
	public void eliminar(int cantidadPedido) {
		Vector<Ingrediente> i = this.receta.obtenerTodosIngredientes();
		for( int x = 0 ; x < i.size() ; x++) {
			this.seccion.actualizarStock(
					i.get(x).getProducto().getNombre(),
					i.get(x).getCantidadInt() * cantidadPedido
					);				
		}
	}
	
	private boolean chequearStock(Ingrediente i, int cantidad) {
		boolean hayStock = false;
		ProductoSeccion prodSecc = null;
		for( int ps = 0 ; ps < this.seccion.getProductos().size() ; ps++) {
			prodSecc = this.seccion.getProductos().get(ps);
			
			if(prodSecc.getProducto().getNombre().equals(i.getProducto().getNombre())) {
				if(prodSecc.getStock() >= i.getCantidad() * cantidad) {
					hayStock = true;
				}
			}
			
		}
		
		return hayStock;
	}
	public boolean existeIngrediente(String ingrediente) {
		return this.receta.buscarIngrediente(ingrediente);
	}

}
